package x.ovo.wechat.bot.common.util;

import com.vdurmont.emoji.EmojiParser;
import lombok.experimental.UtilityClass;

import java.security.SecureRandom;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@UtilityClass
public class WechatUtil {

    // emoji正则
    private static final Pattern PATTERN_EMOJI = Pattern.compile("<span class=\"emoji emoji(.{1,10})\"></span>");

    public static String match(String reg, String text) {
        Pattern pattern = Pattern.compile(reg);
        Matcher m = pattern.matcher(text);
        if (m.find()) return m.group(1);
        return null;
    }

    public static Matcher matcher(String reg, String text) {
        Pattern pattern = Pattern.compile(reg);
        return pattern.matcher(text);
    }

    /**
     * 生成设备 ID
     *
     * @return {@link String }
     */
    public static String generateDeviceId() {
        final Random random = new SecureRandom();
        long nRand = random.nextLong() & 0x7FFFFFFFFFFFFFFFL;
        return "e" + String.format("%015d", nRand).substring(0, 15);
    }

    /**
     * 格式化字符串，处理emoji表情、HTML转义符、Unicode控制符
     *
     * @param str str
     * @return {@link String }
     */
    public static String format(String str) {
        if (str == null || str.isEmpty()) return "";
        str = str.replaceAll("[\\p{C}\\p{Zl}\\p{Zp}]", "")
                .replaceAll("<br/>", "\n")
                .replaceAll("\\u2005", " ")
                .replaceAll("&lt;", "<")
                .replaceAll("&gt;", ">")
                .replaceAll("&amp;", "&")
                .replaceAll("&quot;", "\"")
                .replaceAll("&apos;", "'")
                .replaceAll("&nbsp;", " ");
        return emoji(str);
    }

    /**
     * 处理emoji表情
     *
     * @param text 发短信
     * @return {@link String }
     */
    private static String emoji(String text) {
        Matcher m = PATTERN_EMOJI.matcher(text);
        StringBuilder sb = new StringBuilder();
        int lastStart = 0;
        while (m.find()) {
            String str = m.group(1);
            if (str.length() != 6 && str.length() != 10) {
                str = "&#x" + str + ";";
                String tmp = text.substring(lastStart, m.start());
                sb.append(tmp).append(str);
                lastStart = m.end();
            }
        }
        if (lastStart < text.length()) {
            sb.append(text.substring(lastStart));
        }
        if (!sb.isEmpty()) {
            return EmojiParser.parseToUnicode(sb.toString());
        }
        return text;
    }


    /**
     * 在控制台打印此项目相关信息
     */
    public static void printInfo() {
        String banner = """

                                                                                                                            \s
                                                                                                                            \s
                                                    ,---,                   ___                                      ___    \s
                                                  ,--.' |                 ,--.'|_              ,---,               ,--.'|_  \s
                         .---.                    |  |  :                 |  | :,'     ,---,.,---.'|      ,---.    |  | :,' \s
                        /. ./|                    :  :  :                 :  : ' :   ,'  .' ||   | :     '   ,'\\   :  : ' : \s
                     .-'-. ' |   ,---.     ,---.  :  |  |,--.  ,--.--.  .;__,'  /  ,---.'   ,:   : :    /   /   |.;__,'  /  \s
                    /___/ \\: |  /     \\   /     \\ |  :  '   | /       \\ |  |   |   |   |    |:     |,-..   ; ,. :|  |   |   \s
                 .-'.. '   ' . /    /  | /    / ' |  |   /' :.--.  .-. |:__,'| :   :   :  .' |   : '  |'   | |: ::__,'| :   \s
                /___/ \\:     '.    ' / |.    ' /  '  :  | | | \\__\\/: . .  '  : |__ :   |.'   |   |  / :'   | .; :  '  : |__ \s
                .   \\  ' .\\   '   ;   /|'   ; :__ |  |  ' | : ," .--.; |  |  | '.'|`---'     '   : |: ||   :    |  |  | '.'|\s
                 \\   \\   ' \\ |'   |  / |'   | '.'||  :  :_:,'/  /  ,.  |  ;  :    ;          |   | '/ : \\   \\  /   ;  :    ;\s
                  \\   \\  |--" |   :    ||   :    :|  | ,'   ;  :   .'   \\ |  ,   /           |   :    |  `----'    |  ,   / \s
                   \\   \\ |     \\   \\  /  \\   \\  / `--''     |  ,     .-./  ---`-'            /    \\  /              ---`-'  \s
                    '---"       `----'    `----'             `--`---'                        `-'----'                       \s
                """;
        System.out.println(banner);
        System.out.println("                                                                version: " + WechatUtil.class.getPackage().getImplementationVersion());
        System.out.println("                                                                author: ovo");
        System.out.println("                                                                email: merlin9710@gmail.com\n");
    }
}
